package com.yulongtian.interviewWorks.day20221117;


/**
 * https://leetcode.cn/problems/add-without-plus-lcci/
 * 自己的只能实现非负数的
 * 参考了题解
 *
 * @author yulongTian
 * @create 2022-11-17 15:01
 */
public class Test02 {
    public static void main(String[] args) {
        System.out.println(add(-1, -2));
    }

    public static int add(int a, int b) {

//        String s_a = Integer.toBinaryString(a);
//        String s_b = Integer.toBinaryString(b);
//
//        //补齐0
//        int len_a = s_a.length();
//        int len_b = s_b.length();
//
//        StringBuilder s_0 = new StringBuilder();
//        for (int i = 0; i < Math.abs(len_a - len_b); i++) {
//            s_0.append("0");
//        }
//
//        if (len_a < len_b) {
//            s_a = s_0 + s_a;
//        } else if (len_a > len_b) {
//            s_b = s_0 + s_b;
//        }
//
//        int c = 0;
//        Deque<Character> stack = new LinkedList<>();
//        for (int i = s_a.length() - 1; i >= 0; i--) {
//            int c_a = s_a.charAt(i) - '0';
//            int c_b = s_b.charAt(i) - '0';
//            if (c_a == 0 && c_b == 0) {
//
//                if (c == 0) {
//                    stack.push('0');
//                } else {
//                    stack.push('1');
//                }
//                continue;
//            }
//            if ((c_a == 0 && c_b == 1) || (c_a == 1 && c_b == 0)) {
//                if (c == 0) {
//                    stack.push('1');
//                }else{
//                    stack.push('0');
//                }
//                continue;
//            }
//            if (c_a == 1 && c_b == 1) {
//                if(c==0){
//                    c=1;
//                    stack.push('0');
//                }else{
//                    stack.push('1');
//                }
//            }
//
//
//        }
//        if(c==1){
//            stack.push('1');
//        }
//
//        StringBuilder resStr= new StringBuilder();
//
//        while (!stack.isEmpty()){
//            resStr.append(stack.pop());
//        }
//
//
//        return Integer.valueOf(resStr.toString(), 2);

        int sum = 0, carry = 0;
        while (b != 0) {
            sum = a ^ b;            // 异或计算未进位的部分
            carry = (a & b) << 1;    // 进位部分
            a = sum;                // 保存未进位部分，再次计算
            b = carry;                // 保存进位部分，再次计算
        }
        return a;    // 最后无进位，异或的结果即加法结果
    }


}
